#ifndef _CPERSONAJE_H
#define _CPERSONAJE_H

#include "entidad.h"
#include "control.h"
#include "lista.h"
#include "recursos.h"
#include "tiempo.h"

#define VELOCIDAD_X 				0.02
#define VELOCIDAD_Y 				0.015
#define VELOCIDAD_SALTOY			0.06
#define VELOCIDAD_SALTOX			0.0175
#define GRAVEDAD		    		-0.004
#define ANIM_TEMPO					400
#define NUM_ANIMACIONES				8
#define FRAME_DISPARO				50
#define FRAME_DISPARO_AGACHADO		85
#define FRAME_DISPARO_SALTO			94
#define FRAME_FIN_SALTO				59


/*---------------------------------
	Characters states	
---------------------------------*/
typedef enum
{	
	ESTADO_PJ_NORMAL,
	ESTADO_PJ_CORRER,
	ESTADO_PJ_ATAQUE,				
	ESTADO_PJ_SALTO,
	ESTADO_PJ_AGACHADO,
	ESTADO_PJ_ATAQUE_AGACHADO,		
	ESTADO_PJ_ATAQUE_SALTO,
	ESTADO_PJ_MORIR,
	ESTADO_PJ_MUERTO
}EstadoPersonaje;


/*typedef enum
{	
	ESTADO_PJ_NORMAL,
	ESTADO_PJ_CORRER,
	ESTADO_PJ_ATAQUE,				
	ESTADO_PJ_DANIO_A,
	ESTADO_PJ_DANIO_B,
	ESTADO_PJ_DANIO_C,
	ESTADO_PJ_SALTO,
	ESTADO_PJ_FLIP,
	ESTADO_PJ_SALUTE,
	ESTADO_PJ_FALLBACK,
	ESTADO_PJ_WAVE,
	ESTADO_PJ_POINT,
	ESTADO_PJ_AGACHADO,
	ESTADO_PJ_ANDAR_AGACHADO,
	ESTADO_PJ_ATAQUE_AGACHADO,		
	ESTADO_PJ_TIESO
}EstadoPersonaje2;*/

/*---------------------------------
	Animation data structure
---------------------------------*/
typedef struct
{
    int     first_frame;            // first frame of the animation
    int     last_frame;             // number of frames
    int     fps;                    // number of frames per second
} anim_t;


/*---------------------------------
	Animations list
---------------------------------*/
typedef enum 
{
    STAND,
    RUN,
    ATTACK,
    PAIN_A,
    PAIN_B,
    PAIN_C,
    JUMP,
    FLIP,
    SALUTE,
    FALLBACK,
    WAVE,
    POINT,
    CROUCH_STAND,
    CROUCH_WALK,
    CROUCH_ATTACK,
    CROUCH_PAIN,
    CROUCH_DEATH, 
    DEATH_FALLBACK,
    DEATH_FALLFORWARD,
    DEATH_FALLBACKSLOW,
    BOOM,

    MAX_ANIMATIONS

} animType_t;


/*------------------------------------------------------------------------------
	Implements a character
	Inherits from entity class
------------------------------------------------------------------------------*/
class CPersonaje: public CEntidad
{	
	CTiempo				 m_Tiempo;
	EstadoPersonaje m_Estado;
	
	unsigned int m_uiAnimIni;
	unsigned int m_uiAnimFin;	
	unsigned int m_uiFrameActual;	
	float 	m_fVelocX;
	float 	m_fVelocY;
	Bool	m_bPisandoSuelo;	
	Bool	m_bControlado;
	Bool	m_bVivo;
	static 	anim_t animlist[21];
	static 	anim_t mis_animlist[NUM_ANIMACIONES];
	
public:

	CPersonaje(const char * szFile);
	CPersonaje();
	~CPersonaje();
	void Liberar();
	void Dibujar(unsigned int uiFrame);
	void Actualizar();
	void ActualizarFrame();	
	Bool BajoPlataforma();
	Bool SobrePlataforma();
	Bool EnElSuelo();
	Bool SiguientePasoVacio();
	void HacerCaer();
	
	/*---------------------------------
	 set Functions
	---------------------------------*/
	inline void setEstado(EstadoPersonaje Estado);	
	inline void setPisandoSuelo(Bool Valor)	{m_bPisandoSuelo=Valor;}
	inline void setVelocX(float Valor)			{m_fVelocX=Valor;}
	inline void setVelocY(float Valor)			{m_fVelocY=Valor;}
	inline void setVivo(Bool bValor)			{m_bVivo=bValor;}
	
	/*---------------------------------
	 get Functions
	---------------------------------*/
	inline EstadoPersonaje getEstado()	{return m_Estado;}
	inline Bool getPisandoSuelo()		{return m_bPisandoSuelo;}	
	inline Bool getVivo()				{return m_bVivo;}
	inline float getVelocX()			{return m_fVelocX;}
	inline float getVelocY()			{return m_fVelocY;}
	inline unsigned int getFrameActual(){return m_uiFrameActual;}
	inline unsigned int getAnimFin()	{return m_uiAnimFin;}
};

#endif
